#pragma once
#include <string>
#include <list>
#include "../SQLStatementImpl.h"
#include "SQLDropStatement.h"
#include "SQLDDLStatement.h"

class DbType;
class SQLName;
class SQLExprTableSource;
class SQLASTVisitor;
class SQLCommentHint;
class SQLExpr;

class SQLDropTableStatement :virtual  public SQLStatementImpl, virtual public SQLDropStatement
{
public:
  SQLCommentHint_list_ptr hints;

  SQLExprTableSource_list_ptr tableSources;
  BOOL_ptr purge;
  BOOL_ptr cascade;
  BOOL_ptr restrict;
  BOOL_ptr ifExists;
  BOOL_ptr temporary;
  BOOL_ptr external;
  BOOL_ptr isDropPartition_;
  SQLExpr_ptr where;

  SQLDropTableStatement();

  SQLDropTableStatement(DbType_ptr  dbType);

  SQLDropTableStatement(SQLName_ptr name, DbType_ptr  dbType);

  SQLDropTableStatement(SQLName_ptr name);

  SQLDropTableStatement(SQLExprTableSource_ptr tableSource);

  SQLDropTableStatement(SQLExprTableSource_ptr tableSource, DbType_ptr  dbType);
  SHAREDOBJECT(SQLDropTableStatement);

  SQLExprTableSource_list_ptr getTableSources();

  void addPartition(SQLExprTableSource_ptr tableSource);

  void setName(SQLName_ptr name);

  void addTableSource(SQLName_ptr name);

  void addTableSource(SQLExprTableSource_ptr tableSource);

  void accept0(SQLASTVisitor_ptr visitor);

  SQLExprTableSource_list_ptr getChildren();

  BOOL_ptr isPurge();

  void setPurge(BOOL_ptr purge);

  BOOL_ptr isIfExists();

  void setIfExists(BOOL_ptr ifExists);

  BOOL_ptr isCascade();

  void setCascade(BOOL_ptr cascade);

  BOOL_ptr isRestrict();

  void setRestrict(BOOL_ptr restrict);

  BOOL_ptr isTemporary();

  void setTemporary(BOOL_ptr temporary);

  BOOL_ptr isExternal();

  void setExternal(BOOL_ptr external);

  SQLCommentHint_list_ptr getHints();

  void setHints(SQLCommentHint_list_ptr hints);

  BOOL_ptr isDropPartition();

  void setDropPartition(BOOL_ptr dropPartition);

  SQLExpr_ptr getWhere();

  void setWhere(SQLExpr_ptr x);

  SQLDDLStatement::DDLObjectType getDDLObjectType();

  SQLName_ptr getName();
  virtual SQLObject_ptr clone()
  {
    SQLObject_ptr clone_tmp = std::shared_ptr<SQLDropTableStatement>(new SQLDropTableStatement());
    std::shared_ptr<SQLDropTableStatement> x = std::dynamic_pointer_cast<SQLDropTableStatement>(clone_tmp);
    return x;
  }
};
